VkImageUsageFlags vk_usage;
VkImage vk_image;
VkImageView vk_image_view;
+ VkFramebuffer vk_framebuffer;
+
VkImageLayout vk_image_layout;
VkAccessFlags vk_access;
gsk_vulkan_image_finalize (GObject *object)
{
GskVulkanImage *self = GSK_VULKAN_IMAGE (object);
+ VkDevice device;
+
+ device = gdk_vulkan_context_get_device (self->vulkan);
+
+ if (self->vk_framebuffer != VK_NULL_HANDLE)
+ vkDestroyFramebuffer (device, self->vk_framebuffer, NULL);
if (self->vk_image_view != VK_NULL_HANDLE)
- {
- vkDestroyImageView (gdk_vulkan_context_get_device (self->vulkan),
- self->vk_image_view,
- NULL);
- }
+ vkDestroyImageView (device, self->vk_image_view, NULL);
/* memory is NULL for for_swapchain() images, where we don't own
* the VkImage */
if (self->memory)
- {
- vkDestroyImage (gdk_vulkan_context_get_device (self->vulkan),
- self->vk_image,
- NULL);
+ vkDestroyImage (device, self->vk_image, NULL);
- gsk_vulkan_memory_free (self->memory);
- }
+ g_clear_pointer (&self->memory, gsk_vulkan_memory_free);
g_object_unref (self->vulkan);
{
}
+VkFramebuffer
+gsk_vulkan_image_get_framebuffer (GskVulkanImage *self,
+ VkRenderPass render_pass)
+{
+ if (self->vk_framebuffer)
+ return self->vk_framebuffer;
+
+ GSK_VK_CHECK (vkCreateFramebuffer, gdk_vulkan_context_get_device (self->vulkan),
+ &(VkFramebufferCreateInfo) {
+ .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
+ .renderPass = render_pass,
+ .attachmentCount = 1,
+ .pAttachments = (VkImageView[1]) {
+ self->vk_image_view,
+ },
+ .width = self->width,
+ .height = self->height,
+ .layers = 1
+ },
+ NULL,
+ &self->vk_framebuffer);
+
+ return self->vk_framebuffer;
+}
+
gsize
gsk_vulkan_image_get_width (GskVulkanImage *self)
{
graphene_vec2_t scale;
VkRenderPass render_pass;
- VkFramebuffer framebuffer;
};
struct _GskVulkanParseState
NULL,
&self->render_pass);
- GSK_VK_CHECK (vkCreateFramebuffer, gdk_vulkan_context_get_device (self->vulkan),
- &(VkFramebufferCreateInfo) {
- .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
- .renderPass = self->render_pass,
- .attachmentCount = 1,
- .pAttachments = (VkImageView[1]) {
- gsk_vulkan_image_get_image_view (target)
- },
- .width = gsk_vulkan_image_get_width (target),
- .height = gsk_vulkan_image_get_height (target),
- .layers = 1
- },
- NULL,
- &self->framebuffer);
-
#ifdef G_ENABLE_DEBUG
if (fallback_pixels_quark == 0)
{
g_object_unref (self->vulkan);
g_object_unref (self->target);
cairo_region_destroy (self->clip);
- vkDestroyFramebuffer (device, self->framebuffer, NULL);
vkDestroyRenderPass (device, self->render_pass, NULL);
g_free (self);
&(VkRenderPassBeginInfo) {
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
.renderPass = self->render_pass,
- .framebuffer = self->framebuffer,
+ .framebuffer = gsk_vulkan_image_get_framebuffer (self->target,
+ self->render_pass),
.renderArea = {
{ rect.x, rect.y },
{ rect.width, rect.height }